FEXP Solver  1.0.0.0
FEXPGeom.h
Go to the documentation of this file.
1 // © FEXP, FEXPEnterprise Solver, Ing. Vaclav Rek
3 // Library for geometry.
4 // Compiler must support C++ ver.14 and later
6 #ifndef _CFEXPGEOM_H_
7 #define _CFEXPGEOM_H_
8 #include "FEXPCommon.h"
9 #include "FEXPSerialization.h"
10 
15 namespace FEXPFEGeom
16 {
20  {
21  eC_x = 0,
25  };
26 
30  {
31  eXi = 0,
35  };
36 }
37 
44 // primary template
45 template<typename TValue, typename Enable = void>
49 template<typename TValue>
51  // specialization to floating point types
52  <TValue, typename std::enable_if<std::is_floating_point<TValue>::value>::type>
53 {
54 public:
57 
58  // pure virtual member functions
59  virtual Ptr<TValue> GetCoordArray() = 0;
60 protected:
61  // [no protected members] -----------------------------
62 private:
63  // [no private members ] -----------------------------
64 };
65 
72 #define DEFAULT_COORD_ID -1
73 #define COORD_ERROR "Error: Wrong coordinate identifier!!!"
74 #define COORD_OPTIMIZATION_IS_ON 0
75 
77 template<typename TValue>
79  public ICFEXPFECoordinatesBase<TValue>
80 {
81 public:
83  CFEXPFECoordinates(size_t id);
84  CFEXPFECoordinates(size_t id, TValue cx, TValue cy, TValue cz);
85  CFEXPFECoordinates(size_t id, const std::vector<TValue> & coords);
87  virtual ~CFEXPFECoordinates() { }
88 
89  virtual TValue GetCoordinate(FEXPFEGeom::EFEXPFECoordinates coord) const;
90  virtual void SetCoordinate(FEXPFEGeom::EFEXPFECoordinates coord, TValue value);
91  virtual size_t GetNodeId();
92  virtual void SetNodeId(size_t id);
93 
94  // override base virtual functions
95  virtual Ptr<TValue> GetCoordArray() override;
96 protected:
97  // [no protected members] -----------------------------
98 private:
99  size_t _coordinate_id;
100 #if !COORD_OPTIMIZATION_IS_ON
101  std::vector<TValue> _coordinates;
102 #else
103  Ptr<TValue> _coordinates;
104 #endif
105 };
106 
107 // member functions
109 //--------------------------------------------------------------------------------------
110 template<typename TValue>
113  : _coordinate_id(DEFAULT_COORD_ID)
114 //--------------------------------------------------------------------------------------
115 {
116 #if !COORD_OPTIMIZATION_IS_ON
117  _coordinates.resize(FEXPFEGeom::EFEXPFECoordinates::eC_Count);
118 #else
120 #endif
121 }
122 
123 //--------------------------------------------------------------------------------------
124 template<typename TValue>
127  : _coordinate_id(id)
128 //--------------------------------------------------------------------------------------
129 {
130 #if !COORD_OPTIMIZATION_IS_ON
131  _coordinates.resize(FEXPFEGeom::EFEXPFECoordinates::eC_Count);
132 #else
134 #endif
135 }
136 
137 //--------------------------------------------------------------------------------------
138 template<typename TValue>
140  ::CFEXPFECoordinates(size_t id, TValue cx, TValue cy, TValue cz)
141  : _coordinate_id(id)
142 //--------------------------------------------------------------------------------------
143 {
144 #if !COORD_OPTIMIZATION_IS_ON
145  _coordinates.resize(FEXPFEGeom::EFEXPFECoordinates::eC_Count);
146 #else
148 #endif
149  SetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x, cx);
150  SetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y, cy);
151  SetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z, cz);
152 }
153 
154 //--------------------------------------------------------------------------------------
155 template<typename TValue>
157  ::CFEXPFECoordinates(size_t id, const std::vector<TValue> & coords)
158  : _coordinate_id(id)
159 //--------------------------------------------------------------------------------------
160 {
161 #if !COORD_OPTIMIZATION_IS_ON
162  _coordinates.resize(FEXPFEGeom::EFEXPFECoordinates::eC_Count);
163 #else
165 #endif
166  size_t cntr = 0;
168  SetCoordinate((FEXPFEGeom::EFEXPFECoordinates)(cntr++), *IT);
169 }
170 
171 //--------------------------------------------------------------------------------------
172 template<typename TValue>
175  : _coordinate_id(source._coordinate_id)
176 //--------------------------------------------------------------------------------------
177 {
178 #if !COORD_OPTIMIZATION_IS_ON
179  _coordinates = source._coordinates;
180 #else
182  size_t cntr;
184  {
185  auto coord = (FEXPFEGeom::EFEXPFECoordinates)(cntr++);
186  SetCoordinate(coord, source.GetCoordinate(coord));
187  }
188 #endif
189 }
190 
191 //--------------------------------------------------------------------------------------
192 template<typename TValue>
195 //--------------------------------------------------------------------------------------
196 {
199 
200 #if !COORD_OPTIMIZATION_IS_ON
201  return _coordinates[coord];
202 #else
203  return _coordinates.get()[coord];
204 #endif
205 }
206 
207 //--------------------------------------------------------------------------------------
208 template<typename TValue>
211 //--------------------------------------------------------------------------------------
212 {
215 
216 #if !COORD_OPTIMIZATION_IS_ON
217  _coordinates[coord] = value;
218 #else
219  _coordinates.get()[coord] = value;
220 #endif
221 }
222 
223 //--------------------------------------------------------------------------------------
224 template<typename TValue>
227 //--------------------------------------------------------------------------------------
228 {
229  return _coordinate_id;
230 }
231 
232 //--------------------------------------------------------------------------------------
233 template<typename TValue>
235  ::SetNodeId(size_t id)
236 //--------------------------------------------------------------------------------------
237 {
238  _coordinate_id = id;
239 }
240 
241 //--------------------------------------------------------------------------------------
242 template<typename TValue>
245 //--------------------------------------------------------------------------------------
246 {
247 #if !COORD_OPTIMIZATION_IS_ON
248  auto coord_array = CFEXPDataManager<TValue>::SafeAllocInstanceArray(_coordinates.size());
249  std::copy(_coordinates.begin(), _coordinates.end(), coord_array.get());
250  return coord_array;
251 #else
252  return _coordinates;
253 #endif
254 }
255 
262 
264 template <typename TValue>
266  : public CFEXPFECoordinates<TValue>
267 {
268 public:
269  CFEXPVector(size_t id);
270  CFEXPVector(size_t id, TValue x, TValue y, TValue z);
272  virtual ~CFEXPVector() { }
273 
274  void SetVector(TValue x , TValue y , TValue z);
275  void SetVector(TValue x1, TValue y1, TValue z1, TValue x2, TValue y2, TValue z2);
276  virtual void SetCoordinate(FEXPFEGeom::EFEXPFECoordinates coord, TValue value) override;
277 protected:
278  // [no protected members] -----------------------------
279 private:
280  void create_vector(TValue x, TValue y, TValue z);
281  void normalize ();
282 };
283 
284 // member functions
286 //--------------------------------------------------------------------------------------
287 template <typename TValue>
289 ::CFEXPVector(size_t id)
290  : CFEXPFECoordinates<TValue>(id) { }
291 //--------------------------------------------------------------------------------------
292 
293 //--------------------------------------------------------------------------------------
294 template <typename TValue>
296 ::CFEXPVector(size_t id, TValue x, TValue y, TValue z)
297  : CFEXPFECoordinates<TValue>(id)
298 //--------------------------------------------------------------------------------------
299 {
300  SetVector(x, y, z);
301 }
302 
303 //--------------------------------------------------------------------------------------
304 template <typename TValue>
307  : CFEXPFECoordinates<TValue>(id)
308 //--------------------------------------------------------------------------------------
309 {
310  create_vector(crd2->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x) - crd1->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x),
311  crd2->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y) - crd1->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y),
312  crd2->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z) - crd1->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z));
313 }
314 
315 //--------------------------------------------------------------------------------------
316 template <typename TValue>
318  ::SetVector(TValue x, TValue y, TValue z)
319 //--------------------------------------------------------------------------------------
320 {
321  create_vector(x, y, z);
322 }
323 
324 //--------------------------------------------------------------------------------------
325 template <typename TValue>
327  ::SetVector(TValue x1, TValue y1, TValue z1, TValue x2, TValue y2, TValue z2)
328 //--------------------------------------------------------------------------------------
329 {
330  create_vector(x2 - x1, y2 - y1, z2 - z1);
331 }
332 
333 //--------------------------------------------------------------------------------------
334 template <typename TValue>
337 //--------------------------------------------------------------------------------------
338 {
340  normalize();
341 }
342 
343 //--------------------------------------------------------------------------------------
344 template <typename TValue>
345 void CFEXPVector<TValue>::create_vector(TValue x, TValue y, TValue z)
346 //--------------------------------------------------------------------------------------
347 {
351  normalize();
352 }
353 
354 //--------------------------------------------------------------------------------------
355 template <typename TValue>
357 //--------------------------------------------------------------------------------------
358 {
359  // Normalize process:
360  // 1. calculate length of vector
361  auto length = sqrt(pow(GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x), 2) +
362  pow(GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y), 2) +
363  pow(GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z), 2));
364  // 2. normalize vector
368 }
369 
376 
378 template<typename TValue>
380 {
381 public:
382  CFEX3DPlane(size_t id,
383  const Ptr<CFEXPFECoordinates<TValue>> & nd1,
384  const Ptr<CFEXPFECoordinates<TValue>> & nd2,
385  const Ptr<CFEXPFECoordinates<TValue>> & nd3);
386  virtual ~CFEX3DPlane() { }
387 
389 protected:
390  // [no protected members] -----------------------------
391 private:
392  size_t _id;
393  std::vector<Ptr<CFEXPVector<TValue>>> _plane;
394  void create_plane(size_t id,
395  const Ptr<CFEXPFECoordinates<TValue>> & nd1,
396  const Ptr<CFEXPFECoordinates<TValue>> & nd2,
397  const Ptr<CFEXPFECoordinates<TValue>> & nd3);
398 };
399 
400 // member functions
402 //--------------------------------------------------------------------------------------
403 template<typename TValue>
405  const Ptr<CFEXPFECoordinates<TValue>> & nd1,
406  const Ptr<CFEXPFECoordinates<TValue>> & nd2,
407  const Ptr<CFEXPFECoordinates<TValue>> & nd3)
408 //--------------------------------------------------------------------------------------
409 {
410  create_plane(id, nd1, nd2, nd3);
411 }
412 
413 //--------------------------------------------------------------------------------------
414 template<typename TValue>
415 void CFEX3DPlane<TValue>::create_plane(size_t id,
416  const Ptr<CFEXPFECoordinates<TValue>> & nd1,
417  const Ptr<CFEXPFECoordinates<TValue>> & nd2,
418  const Ptr<CFEXPFECoordinates<TValue>> & nd3)
419 //--------------------------------------------------------------------------------------
420 {
421  _plane.clear();
422  _id = id;
423  // x axis
424  auto vect_x = CFEXPDataManager<CFEXPVector<TValue>>::SafeAllocInstance(0, nd1, nd2);
425  // y axis
426  auto vect_y = CFEXPDataManager<CFEXPVector<TValue>>::SafeAllocInstance(1, nd2, nd3);
427  // z axis
428  // x-coordinate
429  auto valu_x = (vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y) * vect_y->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z)) -
430  (vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z) * vect_y->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y));
431  // y-coordinate
432  auto valu_y = (vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z) * vect_y->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x)) -
433  (vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x) * vect_y->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z));
434  // z-coordinate
435  auto valu_z = (vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x) * vect_y->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y)) -
436  (vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y) * vect_y->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x));
437  auto vect_z = CFEXPDataManager<CFEXPVector<TValue>>::SafeAllocInstance(2, valu_x, valu_y, valu_z);
438 
439  // correction of vector of y axis
440  // x-coordinate
441  valu_x = (vect_z->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y) * vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z)) -
442  (vect_z->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z) * vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y));
443  // y-coordinate
444  valu_y = (vect_z->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z) * vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x)) -
445  (vect_z->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x) * vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_z));
446  // z-coordinate
447  valu_z = (vect_z->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x) * vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y)) -
448  (vect_z->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_y) * vect_x->GetCoordinate(FEXPFEGeom::EFEXPFECoordinates::eC_x));
449  vect_y->SetVector(valu_x, valu_y, valu_z);
450  // create plane
451  _plane = { vect_x, vect_y, vect_z };
452 }
453 
454 //--------------------------------------------------------------------------------------
455 template<typename TValue>
457 //--------------------------------------------------------------------------------------
458 {
459  return _plane[coord];
460 }
461 
468 // default ratio for wideing of a bounding box
469 #define DEFAULT_BB_RATIO 1.0 / 10.0
470 
473 {
474 public:
475  enum EBoundingBox { eMin, eMax };
476  using t_BoundBox = std::map<EBoundingBox, Ptr<CFEXPFECoordinates<t_fexpcommon_ct>>>;
479  // bounding box serialization
482 protected:
483  // [no protected members] -----------------------------
484 private:
485  // [no private members ] -----------------------------
486 };
487 
492 template<typename TValue>
493 using t_MacroModelMap = std::map<size_t,
494  std::vector<std::tuple<size_t, Ptr<CFEXGeomTools::t_BoundBox>>>>;
495 
496 #endif // !_CFEXPGEOM_H_
Definition: FEXPGeom.h:475
#define IT
Definition: FEXPCommon.h:155
EFEXPFENaturalCoordinates
Type of individual natural coordinate.
Definition: FEXPGeom.h:29
std::map< size_t, std::vector< std::tuple< size_t, Ptr< CFEXGeomTools::t_BoundBox > >> > t_MacroModelMap
Definition: FEXPGeom.h:494
virtual void SetCoordinate(FEXPFEGeom::EFEXPFECoordinates coord, TValue value)
Definition: FEXPGeom.h:210
Definition: FEXPGeom.h:31
std::map< EBoundingBox, Ptr< CFEXPFECoordinates< t_fexpcommon_ct > >> t_BoundBox
Definition: FEXPGeom.h:476
Plane definition.
Definition: FEXPGeom.h:379
virtual ~CFEXPFECoordinates()
Definition: FEXPGeom.h:87
#define FEXPCOMMON_FOREACH(start, end, index)
Definition: FEXPCommon.h:153
static Ptr< t_SerializedData > GetSerializedBoundingBox(Ptr< t_BoundBox > bb)
Definition: FEXPGeom.cpp:90
Definition: FEXPGeom.h:46
Definition: FEXPGeom.h:32
Finite element node coordinates.
Definition: FEXPGeom.h:78
Definition: FEXPGeom.h:34
virtual Ptr< TValue > GetCoordArray() override
Definition: FEXPGeom.h:244
Definition: FEXPCommon.h:276
double t_fexpcommon_ct
Definition: FEXPCommon.h:120
CFEX3DPlane(size_t id, const Ptr< CFEXPFECoordinates< TValue >> &nd1, const Ptr< CFEXPFECoordinates< TValue >> &nd2, const Ptr< CFEXPFECoordinates< TValue >> &nd3)
Definition: FEXPGeom.h:404
EBoundingBox
Definition: FEXPGeom.h:475
static Ptr< t_BoundBox > ExtBoundingBox(Ptr< CFEXGeomTools::t_BoundBox > current_bb, t_fexpcommon_ct ratio)
Definition: FEXPGeom.cpp:63
Definition: FEXPGeom.h:33
Definition: FEXPGeom.h:475
virtual TValue GetCoordinate(FEXPFEGeom::EFEXPFECoordinates coord) const
Definition: FEXPGeom.h:194
static Ptr< t_BoundBox > GetBoundingBox(Ptr< CFEXGeomTools::t_BoundBox > current_bb, Ptr< CFEXPFECoordinates< t_fexpcommon_ct >> item_to_check)
Definition: FEXPGeom.cpp:9
#define FEXPCOMMON_DEFAULT_INDX
Definition: FEXPCommon.h:171
CFEXPVector(size_t id)
Definition: FEXPGeom.h:289
Ptr< CFEXPVector< TValue > > & GetVector(FEXPFEGeom::EFEXPFECoordinates coord)
Definition: FEXPGeom.h:456
Geometry tools (bounding box handling).
Definition: FEXPGeom.h:472
#define FEXPCOMMON_EXCEPTION(error_text)
Definition: FEXPCommon.h:143
Definition: FEXPGeom.h:22
virtual size_t GetNodeId()
Definition: FEXPGeom.h:226
#define FEXPCOMMON_FOREACH_ITER(data)
Definition: FEXPCommon.h:156
Definition: FEXPGeom.h:21
static Ptr< t_BoundBox > GetDeserializedBoundingBox(Ptr< t_SerializedData > bb)
Definition: FEXPGeom.cpp:108
#define DEFAULT_COORD_ID
Definition: FEXPGeom.h:72
virtual ~CFEXPVector()
Definition: FEXPGeom.h:272
Definition: FEXPGeom.h:23
virtual void SetCoordinate(FEXPFEGeom::EFEXPFECoordinates coord, TValue value) override
Definition: FEXPGeom.h:336
virtual ~CFEX3DPlane()
Definition: FEXPGeom.h:386
#define COORD_ERROR
Definition: FEXPGeom.h:73
Definition: FEXPGeom.h:24
static Ptr< TType > SafeAllocInstanceArray(size_t length)
It allocates data array.
Definition: FEXPCommon.h:410
Smart pointer.
Definition: FEXPCommon.h:274
virtual void SetNodeId(size_t id)
Definition: FEXPGeom.h:235
CFEXPFECoordinates()
Definition: FEXPGeom.h:112
Definition: FEXPGeom.h:15
Vector definition.
Definition: FEXPGeom.h:265
void SetVector(TValue x, TValue y, TValue z)
Definition: FEXPGeom.h:318
EFEXPFECoordinates
Type of individual coordinate.
Definition: FEXPGeom.h:19